#ifndef WIFIINDICATOR_H
#define WIFIINDICATOR_H

#include <QDeclarativeItem>
#include <QTimer>
#include <QQueue>
#include <QPen>
#include <QFont>
#include <QColor>
#include <QPainter>
#include <QPixmap>
#include <QDebug>

#include <QAbstractListModel>
#include <QStringList>
#include <QVariant>

#include <QDeclarativeView>

#include "wifidata.h"

class WiFiIndicator : public QDeclarativeItem
{
    Q_OBJECT
    Q_PROPERTY( int height READ getHeight WRITE setHeight NOTIFY changeHeight )
    Q_PROPERTY( int width READ getWidth WRITE setWidth NOTIFY changeWidth )

    Q_PROPERTY( bool isWork READ getStatusTimer WRITE setStatusTimer NOTIFY changeStatusMonitor )

    Q_PROPERTY( QString identify READ getId WRITE setId NOTIFY changeValueParam )

    Q_PROPERTY( QString essid READ getESSID NOTIFY changeValueParam )
    Q_PROPERTY( double val_per READ getValue_per NOTIFY changeValueParam )
    Q_PROPERTY( double val_dbm READ getValue_dbm NOTIFY changeValueParam )

    QString macAddrWiFi;

    QString iface;

    /* основной таймер опроса */
    QTimer timer;
    int timeout;

    /* временные параметры графика */
    int __timestamp;

    /* размеры графика в ландшафтном режиме */
    int LX_l, LY_l;
    /* размеры графика в портретном режиме */
    int LX_p, LY_p;

    int shiftX, shiftY;
    int lenghtX, lenghtY;

    /* длина графика по Y */
    int Ly;
    /* длина графика по X */
    int Lx;

    /* ширина линии графика */
    int pxLenGraph;

    int X;

    /* очереди, содержащие данные, отображаемые на графике */
    QQueue<float> dataGraph;
    QQueue<int> viewTimestampMarker;

    /* кисть и шрифт сетки */
    QPen penGrid;
    QFont fontGrid;

    /* кисть и шрифт системы координат */
    QPen penSC;

    /* хранит время в секундах с момента запуска */
    int storeTime;

    WiFiData *wifiData;
    bool isUpdateRunning;
    bool flDataExists;

    void drawSystemCoord( QPainter* paint );
    void drawGrid( QPainter* paint );
    void drawGraph( QPainter* paint );

    QString humanTimestamp( const int timestamp ) const;

    QString _essid;
    double _val_per;
    double _val_dbm;

public:
    explicit WiFiIndicator(QDeclarativeItem *parent = 0);
    virtual void paint(QPainter *paint, const QStyleOptionGraphicsItem *options, QWidget *widget);

    inline int getHeight( ) { return lenghtY; }
    inline void setHeight( const int h ) { lenghtY = h; }

    inline int getWidth( ) { return lenghtX; }
    inline void setWidth( const int w ) { lenghtX = w; }

    inline bool getStatusTimer( ) { return timer.isActive(); }
    inline void setStatusTimer( bool s ) { if(s) { timer.stop(); } else { timer.start(); } }

    inline int getTimestamp( ) { return __timestamp; }
    inline void setTimestamp( const int ts ) { __timestamp = ts; }

    inline int getRefreshInt( ) { return timeout; }
    inline void setRefreshInt( const int t ) {
        timeout = t;
        if( timer.isActive() ) {
            timer.stop();
            timer.setInterval( t*1000 );
            timer.start();
        } else {
            timer.setInterval( t*1000 );
        }
    }

    inline QString getId( ) { return macAddrWiFi; }
    inline void setId( const QString v ) { macAddrWiFi = v; }

    inline QString getESSID() { return _essid; }

    inline double getValue_per() { return _val_per; }
    inline double getValue_dbm() { return _val_dbm; }
    
signals:
    void changeHeight();
    void changeWidth();
    void changeStatusMonitor();
    void changeValueParam();
    void changeSettings();
    void updateStatusChange();
    
public slots:
    Q_INVOKABLE void getData();
    Q_INVOKABLE void timerStart();
    Q_INVOKABLE void timerStop();

private slots:
    void getWiFiData( bool );
    void getWiFiError();
    void updateWiFiData();
    
};

#endif // WIFIINDICATOR_H
